/* eslint-disable camelcase */
// 封装axios
import store from '@/store'
import { Toast } from 'antd-mobile'
import history from './history'
import axios, { AxiosError } from 'axios'
import { getToken, hasToken } from './storage'
import { logout, saveToken } from '@/store/actions/login'
const baseURL = 'http://geek.itheima.net/v1_0/'
const instance = axios.create({
  baseURL,
  timeout: 5000
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    if (hasToken()) {
      const token = getToken().token
      // 添加到请求头(!非空断言)
      config.headers!.Authorization = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error: AxiosError) {
    console.dir(error, '错错错')
    if (!error.response) {
      Toast.show({
        content: '网络请求超时!'
      })
      return Promise.reject(error)
    }
    if (error.response.status !== 401) {
      Toast.show({
        content: '操作错误!'
      })
      return Promise.reject(error)
    }
    // 401 错误解释
    if (error.response.status === 401) {
      const { refresh_token } = getToken()
      console.log('refresh_token', refresh_token)
      if (refresh_token) {
        try {
          const res = await axios.put(`${baseURL}authorizations`, null, {
            headers: {
              Authorization: `Bearer ${refresh_token}`
            }
          })
          store.dispatch(
            saveToken({ token: res.data.data.token, refresh_token })
          )
          // eslint-disable-next-line no-debugger
          // debugger
          // 返回数据
          return instance(error.config)
        } catch (e) {
          history.replace('/login')
          store.dispatch(logout())
          // 对响应错误做点什么
          // 抛出的错误会在别的页面里的try{}catch(e){}中的 e 接收
          return Promise.reject(error)
        }
      } else {
        history.replace('/login', { from: history.location.pathname })
        Toast.show('登录信息过期')
        // 对响应错误做点什么
        // 抛出的错误会在别的页面里的try{}catch(e){}中的 e 接收
        return Promise.reject(error)
      }
    }
  }
)

export default instance
